코딩테스트 연습 - 최대공약수와 최소공배수 | 프로그래머스 스쿨
[ 템플릿 코드 ]
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n, int m) {
vector<int> answer;
return answer;
}[ 풀이 ]
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n, int m)
{
vector<int> answer;
int gcd = 1;
for (int i = 1; i <= min(n, m); i++)
{
if (n % i == 0 && m % i == 0)
{
gcd = i;
}
}
int lcm = n * m / gcd;
answer.push_back(gcd);
answer.push_back(lcm);
return answer;
}[ 해설 ]
#include <string> // string 자료형을 사용하기 위한 헤더
#include <vector> // vector 컨테이너를 사용하기 위한 헤더
using namespace std; // std:: 를 생략하고 사용하기 위해 선언
// 최대공약수와 최소공배수를 반환하는 함수
vector<int> solution(int n, int m)
{
vector<int> answer; // 결과를 저장할 벡터
// answer[0] = 최대공약수
// answer[1] = 최소공배수
int gcd = 1; // 최대공약수를 저장할 변수
// 최소값은 1이므로 초기값을 1로 설정
// 최대공약수 찾기
// 1부터 n과 m 중 더 작은 수까지 반복
// 두 수의 공약수 중 가장 큰 값을 찾는다.
for (int i = 1; i <= min(n, m); i++)
{
// i가 n과 m을 모두 나누어 떨어지게 하면
// i는 두 수의 공약수이다.
if (n % i == 0 && m % i == 0)
{
// 반복문이 작은 수부터 큰 수 순서로 진행되므로
// 조건을 만족할 때마다 gcd를 갱신하면
// 마지막에 저장되는 값이 가장 큰 공약수(최대공약수)가 된다.
gcd = i;
}
}
// 최소공배수 계산
// 두 수의 곱을 최대공약수로 나누면 최소공배수가 된다.
int lcm = n * m / gcd;
// 계산한 최대공약수를 결과 벡터에 저장
answer.push_back(gcd);
// 계산한 최소공배수를 결과 벡터에 저장
answer.push_back(lcm);
// [최대공약수, 최소공배수] 형태의 벡터 반환
return answer;
}- 최대공약수(GCD): 유클리드 호제법 사용
- 최소공배수(LCM):

[ 타 답안 ]
#include <string> // string 자료형을 사용하기 위한 헤더
#include <vector> // vector 컨테이너를 사용하기 위한 헤더
using namespace std; // std::를 생략하기 위해 사용
// 최대공약수(GCD)를 구하는 함수
// 유클리드 호제법 사용
int GCD(int a, int b)
{
// b가 0이 될 때까지 반복
while (b != 0)
{
// 현재 b 값을 임시 저장
int temp = b;
// a를 b로 나눈 나머지를 b에 저장
// 다음 반복에서 계산에 사용됨
b = a % b;
// 기존 b 값을 a에 저장
a = temp;
}
// 반복문이 종료되면
// a에는 최대공약수가 저장되어 있음
return a;
}
// 최대공약수와 최소공배수를 구하는 함수
vector<int> solution(int n, int m)
{
// GCD 함수를 호출하여 최대공약수 계산
int gcd = GCD(n, m);
// 최소공배수 계산
// (두 수의 곱) ÷ (최대공약수)
int lcm = n * m / gcd;
// {최대공약수, 최소공배수} 형태의 벡터 반환
return {gcd, lcm};
}